/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pessoas.presenter;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import pessoas.collection.Contatos;
import pessoas.collection.ContatosInvalidos;
import pessoas.collection.Operadoras;
import pessoas.dataHora.DataHora;
import pessoas.interfaces.IObservadorContatosInvalidos;
import pessoas.model.Contato;
import pessoas.model.Usuario;
import pessoas.serializacao.serializacaoArquivo;
import pessoas.view.ContatosInvalidosView;

/**
 *
 * @author Bush
 */
public class ContatosInvalidosPresenter implements IObservadorContatosInvalidos{

    private ContatosInvalidosView view;
    private DefaultTableModel tm;
    private Contatos contatos;
    private ContatosInvalidos invalidos;
    private Operadoras operadoras;
    private DataHora dataHora;
    private Contato contato;
    private Usuario usuario;

    public ContatosInvalidosPresenter(Usuario usuario, Contatos contatos, ContatosInvalidos invalidos) {
        
        view = new ContatosInvalidosView(null, true);
        tm = new DefaultTableModel();
        this.contatos = contatos;
        this.invalidos = invalidos;
        this.usuario = usuario;
        
        dataHora = new DataHora();
        carregaTabela(invalidos.getContatosInvalidos());
        
        try {
            ContatosInvalidos.getInstancia().cadastrarObservador(this);
            this.operadoras = Operadoras.getInstancia();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }

        view.getBtnAlterar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    alterar();
                } catch (FileNotFoundException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (IllegalAccessException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (InstantiationException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (ClassNotFoundException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
        });

        view.getBtnFechar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                fechar();
            }
        });

        view.getTabela().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                view.getTxtNome().setText(view.getTabela().getValueAt(view.getTabela().getSelectedRow(), 0).toString());
                view.getTxtSobrenome().setText(view.getTabela().getValueAt(view.getTabela().getSelectedRow(), 1).toString());
                view.getTxtTelefone().setValue(view.getTabela().getValueAt(view.getTabela().getSelectedRow(), 2).toString());

            }
        });

        view.getTxtTelefone().addKeyListener(new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent e) {
                atualizaUFOperadoras();

            }
        });

        view.setLocationRelativeTo(view);
        view.setVisible(true);
    }

    public void atualizaUFOperadoras() {
        String tel = view.getTxtTelefone().getText().substring(1, 3) + view.getTxtTelefone().getText().substring(4);
        tel = tel.replace(" ", "").replace("-", "");
        if (tel.length() == 10) {
            try {
                String nome = view.getTxtNome().getText();
                String sobrenome = view.getTxtSobrenome().getText();
                String telefone = view.getTxtTelefone().getText();
                Contato contato = new Contato(nome, sobrenome, telefone, null, null);
                contato = operadoras.detectaUfOperadora(contato);
                if (contato == null) {
                    throw new Exception("Insira um DDD válido !!");
                }
                view.getComboUf().setSelectedItem(contato.getUf());
                view.getComboOper().setSelectedItem(contato.getOperadora());
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }

    }

    public void alterar() throws FileNotFoundException, IllegalAccessException, InstantiationException, ClassNotFoundException, IOException {
        try {
            serializacaoArquivo serializacao = new serializacaoArquivo();
            String nome = view.getTxtNome().getText();
            String sobrenome = view.getTxtSobrenome().getText();
            Object telefone = view.getTxtTelefone().getValue();
            if ((!nome.equals("")) && (!sobrenome.equals("")) && (telefone != null)
                    && !view.getComboUf().getSelectedItem().toString().substring(0, 2).equals("UF")
                    && !view.getComboOper().getSelectedItem().toString().equals("Operadoras")) {
                contato = new Contato(
                        view.getTxtNome().getText(),
                        view.getTxtSobrenome().getText(),
                        view.getTxtTelefone().getText(),
                        view.getComboUf().getSelectedItem().toString().substring(0, 2),
                        view.getComboOper().getSelectedItem().toString()
                );
                if (contatos.verificaContato(contato)) {
                    throw new Exception("O contato já existe !!");
                }
                invalidos.salvarContato(contato);
                contatos.gravarLog("<Atualização> do contato <<" + contato.getNome() + ">>,<<" + dataHora.getHora() + ">>,<<" + dataHora.getData()
                        + ">>,<<" + this.usuario.getNomeUsuario() + ">>.");
                JOptionPane.showMessageDialog(view, nome + " " + sobrenome + " Cadastrado com sucesso!");
                JOptionPane.showMessageDialog(null, "Atualizado com Sucesso!!");
            } else {
                throw new IllegalArgumentException("Você precisa informar os campos");
            }
            view.getTxtNome().setText("");
            view.getTxtSobrenome().setText("");
            view.getTxtTelefone().setText("");
            view.getComboUf().setSelectedIndex(0);
            view.getComboOper().setSelectedIndex(0);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
            contatos.gravarLog("Ocorreu a falha:" + ex.getMessage() + "ao realizar <Inclusão> do contato <<" + contato.getNome() + 
                    ">>,<<" + dataHora.getHora() + ">>,<<" + dataHora.getData()
                    + ">>,<<" + this.usuario.getNomeUsuario() + ">>.");
        }

    }

    public void fechar() {
        view.dispose();
    }

    public void carregaTabela(ArrayList<Contato> c) {
        tm = new DefaultTableModel(
                new Object[][]{},
                new String[]{"Nome", "SobreNome", "Telefone", "Uf", "Operadora"}) {

                    @Override
                    public boolean isCellEditable(int row, int col) {
                        return false;
                    }
                };
        tm.setNumRows(0);
        for (int i = 0; i < c.size(); i++) {
            String contato = c.get(i).toString();
            String linha[] = contato.split(",");
            tm.addRow(linha);
        }
        view.getTabela().setModel(tm);
    }

    @Override
    public void atualizar(ContatosInvalidos contatosInvalidos) {
        carregaTabela(contatosInvalidos.getContatosInvalidos());
    }
}
